package cn.iocoder.yudao.module.system.dal.mysql.exam;

import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.exam.ExamReportDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 测评报告 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface ExamReportMapper extends BaseMapperX<ExamReportDO> {

    /**
     * 根据用户ID和测试批次号查询报告
     *
     * @param userId 用户ID
     * @param testBatchNo 测试批次号
     * @return 报告信息
     */
    default ExamReportDO selectByUserIdAndBatchNo(Long userId, String testBatchNo) {
        return selectOne(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getUserId, userId)
                .eq(ExamReportDO::getTestBatchNo, testBatchNo));
    }

    /**
     * 根据用户ID查询报告列表
     *
     * @param userId 用户ID
     * @return 报告列表
     */
    default List<ExamReportDO> selectByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getUserId, userId)
                .orderByDesc(ExamReportDO::getCreateTime));
    }

    /**
     * 根据用户ID获取最新的报告
     *
     * @param userId 用户ID
     * @return 最新的报告
     */
    default ExamReportDO selectLatestByUserId(Long userId) {
        return selectOne(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getUserId, userId)
                .eq(ExamReportDO::getStatus, 1)
                .orderByDesc(ExamReportDO::getCreateTime)
                .last("LIMIT 1"));
    }

    /**
     * 根据appKey和tbl查询报告列表
     *
     * @param appKey API密钥
     * @param tbl 测评类型标记值
     * @return 报告列表
     */
    default List<ExamReportDO> selectByAppKeyAndTbl(String appKey, String tbl) {
        return selectList(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getAppKey, appKey)
                .eqIfPresent(ExamReportDO::getTbl, tbl)
                .orderByDesc(ExamReportDO::getCreateTime));
    }

    /**
     * 根据用户ID删除报告
     *
     * @param userId 用户ID
     * @return 删除数量
     */
    default int deleteByUserId(Long userId) {
        return delete(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getUserId, userId));
    }

    /**
     * 根据用户ID和测试批次号删除报告
     *
     * @param userId 用户ID
     * @param testBatchNo 测试批次号
     * @return 删除数量
     */
    default int deleteByUserIdAndBatchNo(Long userId, String testBatchNo) {
        return delete(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getUserId, userId)
                .eq(ExamReportDO::getTestBatchNo, testBatchNo));
    }

    /**
     * 根据答题组合查询已存在的报告（用于缓存机制）
     *
     * @param appKey API密钥
     * @param tbl 测评类型标记值
     * @param reportType 报告类型
     * @param answerString 答案字符串
     * @param isAllAnswer 是否提交所有题目的答案
     * @return 已存在的报告，如果没有则返回null
     */
    default ExamReportDO selectByAnswerCombination(String appKey, String tbl, String reportType,
                                                  String answerString, String isAllAnswer) {
        return selectOne(new LambdaQueryWrapperX<ExamReportDO>()
                .eq(ExamReportDO::getAppKey, appKey)
                .eqIfPresent(ExamReportDO::getTbl, tbl)
                .eq(ExamReportDO::getReportType, reportType)
                .eq(ExamReportDO::getAnswerString, answerString)
                .eq(ExamReportDO::getIsAllAnswer, isAllAnswer)
                .eq(ExamReportDO::getStatus, 1)
                .orderByDesc(ExamReportDO::getCreateTime)
                .last("LIMIT 1"));
    }

}
